Client-Side Load Balancing হলো একটি কৌশল যেখানে ক্লায়েন্ট নিজেই বিভিন্ন সার্ভারের মধ্যে ইনকামিং অনুরোধগুলো (requests) বন্টন করে। এটি সাধারণত Spring Cloud ব্যবহার করে পরিচালিত হয়, যেখানে Ribbon এবং Spring Cloud LoadBalancer-এর মতো টুলস ব্যবহৃত হয়।
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
Eureka Server সার্ভিস রেজিস্ট্রির জন্য Spring Boot অ্যাপ্লিকেশন চালু করুন:
pom.xml
-এ নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application.properties
কনফিগার করুন:
spring.application.name=eureka-server
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
Eureka Server চালু করার জন্য @EnableEurekaServer
ব্যবহার করুন:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Spring Boot ক্লায়েন্ট সার্ভিসের জন্য:
pom.xml
-এ নিচের ডিপেন্ডেন্সি যোগ করুন:<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.properties
কনফিগার করুন:spring.application.name=user-service
server.port=8080
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
WebClient
এবং Spring Cloud LoadBalancer ব্যবহার করে সার্ভার লোড ব্যালেন্সিং কার্যকর করুন।
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
@LoadBalanced // LoadBalancer এর জন্য Annotation
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class UserClient {
private final WebClient webClient;
public UserClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://user-service").build();
}
public Mono<String> getUserById(int userId) {
return webClient.get()
.uri("/users/{id}", userId)
.retrieve()
.bodyToMono(String.class);
}
}
Eureka Server
চালু করুন।user-service
নামে একটি সার্ভিস চালু করুন (যা ব্যবহারকারীর ডেটা সরবরাহ করবে)।Eureka Server
থেকে উপলব্ধ সার্ভিস তালিকা সংগ্রহ করে।user-service
নামে দুটি সার্ভিস আলাদা পোর্টে চলছে:
localhost:8081
localhost:8082
localhost:8081
-এ।localhost:8082
-এ।application.properties
ফাইলে কনফিগার করুন:
spring.cloud.loadbalancer.ribbon.eureka.enabled=true
spring.cloud.loadbalancer.ribbon.enabled=true
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.ReactiveLoadBalancer;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
@LoadBalancerClient(name = "custom-loadbalancer", configuration = CustomLoadBalancerConfig.class)
public class CustomLoadBalancer implements ReactiveLoadBalancer<ServiceInstance> {
@Override
public Mono<Response<ServiceInstance>> choose(Request request) {
// Custom Load Balancing Logic
return Mono.just(new DefaultResponse(null)); // Replace null with your logic
}
}
Spring Boot-এ Client-Side Load Balancing WebClient এর মাধ্যমে কার্যকরভাবে করা সম্ভব। এটি মাইক্রোসার্ভিস আর্কিটেকচারে সার্ভিস ডিসকভারি এবং উচ্চতর পারফরমেন্স নিশ্চিত করে। Spring Cloud LoadBalancer একটি লাইটওয়েট এবং সহজ সমাধান যা Ribbon এর তুলনায় আরও আধুনিক এবং কার্যকর।
Load Balancing হলো একটি পদ্ধতি, যা একাধিক সার্ভারের মধ্যে কাজের চাপ (লোড) ভাগাভাগি করে দেয়। এর উদ্দেশ্য হলো সার্ভারগুলোর সক্ষমতা নিশ্চিত করা এবং সিস্টেমের পারফরম্যান্স, স্থায়িত্ব এবং স্কেলেবিলিটি বৃদ্ধি করা। এটি বিশেষ করে মাইক্রোসার্ভিস আর্কিটেকচার-এ ব্যবহৃত হয় যেখানে বিভিন্ন সার্ভার বা ইন্সট্যান্সের মধ্যে কাজ সমানভাবে বিতরণ করা প্রয়োজন।
Spring Boot-এ সাধারণত Spring Cloud এর মাধ্যমে Client-Side Load Balancing করা হয়। Spring Boot বিভিন্ন টুল ব্যবহার করে লোড ব্যালান্সিং সমর্থন করে, যেমন:
Spring Cloud LoadBalancer একটি Client-Side Load Balancer, যা Spring Boot 2.2 এবং তার পরে Ribbon-এর পরিবর্তে ব্যবহৃত হয়।
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class LoadBalancerConfig {
@Bean
@LoadBalanced // Load Balancing সক্ষম
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
public class LoadBalancerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/fetch-data")
public String fetchData() {
String response = restTemplate.getForObject("http://example-service/data", String.class);
return response;
}
}
উপরে @LoadBalanced
এনোটেশন ব্যবহার করলে Spring Cloud LoadBalancer কাজ করবে এবং সার্ভারগুলোর মধ্যে রিকোয়েস্ট সমানভাবে বিতরণ করবে।
@Configuration
public class WebClientConfig {
@Bean
@LoadBalanced // Load Balancing সক্ষম
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
@RestController
public class WebClientLoadBalancerController {
@Autowired
private WebClient.Builder webClientBuilder;
@GetMapping("/fetch-data")
public String fetchData() {
return webClientBuilder.build()
.get()
.uri("http://example-service/data")
.retrieve()
.bodyToMono(String.class)
.block();
}
}
Spring Boot-এর Load Balancing ফিচার সার্ভারগুলোর মধ্যে রিকোয়েস্ট সমানভাবে বিতরণ করে সিস্টেমের পারফরম্যান্স, স্থিতিশীলতা, এবং রেডান্ডেন্সি বৃদ্ধি করে। এটি বড় এবং জটিল মাইক্রোসার্ভিস ভিত্তিক অ্যাপ্লিকেশনগুলোর জন্য অপরিহার্য।
Spring Cloud LoadBalancer এবং Ribbon হল Spring Framework এর দুটি উপাদান যা মাইক্রোসার্ভিস আর্কিটেকচারে লোড ব্যালেন্সিং নিশ্চিত করতে ব্যবহার করা হয়। এগুলি সার্ভিসগুলির মধ্যে ভারসাম্যপূর্ণ এবং দক্ষ যোগাযোগ স্থাপন করতে সাহায্য করে।
Spring Cloud LoadBalancer হলো Spring Cloud এর অংশ, যা Ribbon-এর বিকল্প হিসেবে কাজ করে। এটি Spring Boot এর নতুন এবং আধুনিক লোড ব্যালেন্সিং সমাধান।
Spring Boot 2.4 থেকে Spring Cloud LoadBalancer ডিফল্ট ভাবে উপলব্ধ। তবে নিশ্চিত করতে নিচের ডিপেনডেন্সি যোগ করুন:
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class LoadBalancerController {
private final RestTemplate restTemplate;
public LoadBalancerController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/get-data")
public String getData() {
String url = "http://my-service-name/api/data"; // সার্ভিসের নাম
return restTemplate.getForObject(url, String.class);
}
}
my-service-name
) DNS-এ সমাধান করা হবে Spring Cloud LoadBalancer এর মাধ্যমে।import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClients;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Flux;
@Configuration
@LoadBalancerClients({
@LoadBalancerClient(name = "my-service-name", configuration = CustomLoadBalancerConfig.class)
})
public class CustomLoadBalancerConfig {
@Bean
public ServiceInstanceListSupplier serviceInstanceListSupplier() {
return new ServiceInstanceListSupplier() {
@Override
public Flux<List<ServiceInstance>> get() {
// Custom logic for instance selection
return Flux.just(List.of(
// Define your service instances here
));
}
};
}
}
Ribbon একসময় Spring Framework এর ডিফল্ট লোড ব্যালেন্সার ছিল। Spring Cloud 2020 (Hoxton) এর পরে এটি ডিপ্রিকেটেড হয়েছে এবং Spring Cloud LoadBalancer এর মাধ্যমে প্রতিস্থাপিত হয়েছে।
Ribbon ব্যবহার করতে Spring Cloud Netflix Starter ডিপেনডেন্সি যোগ করুন।
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Ribbon সার্ভিস ডিসকভারি এবং লোড ব্যালেন্সিং কনফিগার করার জন্য প্রয়োজন।
my-service-name:
ribbon:
listOfServers: localhost:8081,localhost:8082
ConnectTimeout: 5000
ReadTimeout: 5000
@RestController
public class RibbonController {
private final RestTemplate restTemplate;
public RibbonController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/ribbon-test")
public String ribbonTest() {
String url = "http://my-service-name/api/data";
return restTemplate.getForObject(url, String.class);
}
}
বৈশিষ্ট্য | Spring Cloud LoadBalancer | Ribbon (Deprecated) |
---|---|---|
স্ট্যাটাস | Active | Deprecated (Spring Cloud 2020 থেকে বন্ধ করা হয়েছে)। |
Configuration Method | Annotation এবং Programmatic | Mostly YAML/Properties-based |
Customizability | সহজে কাস্টমাইজ করা যায়। | কম কাস্টমাইজেবল। |
Reactive Support | সমর্থন করে। | সমর্থন করে না। |
Dependency | Spring Cloud Starter LoadBalancer | Spring Cloud Netflix Ribbon |
প্রয়োজন হলে আরও উদাহরণ বা বিস্তারিত জানাতে বলুন! 😊
Client-side load balancing হলো এমন একটি পদ্ধতি, যেখানে ক্লায়েন্ট অ্যাপ্লিকেশন সার্ভিস ইন্সট্যান্সগুলোর তালিকা পায় এবং নিজে থেকেই সার্ভিস ইন্সট্যান্স নির্বাচন করে। Spring Boot-এ Spring Cloud LoadBalancer
এবং Ribbon
(ডিপ্রিকেটেড) ব্যবহার করে ক্লায়েন্ট-সাইড লোড ব্যালেন্সিং সেটআপ করা যায়।
Spring Cloud LoadBalancer হলো একটি ক্লায়েন্ট-সাইড লোড ব্যালেন্সার, যা API কল করার সময় বিভিন্ন সার্ভিস ইন্সট্যান্সের মধ্যে লোড ভাগাভাগি করে।
Spring Cloud LoadBalancer
ব্যবহার করতে, আপনার pom.xml
বা build.gradle
-এ নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
application.yml
কনফিগার করাসার্ভিস ইন্সট্যান্সগুলোর তালিকা কনফিগার করুন। উদাহরণস্বরূপ, যদি আপনার order-service
নামে একটি সার্ভিস থাকে:
spring:
cloud:
discovery:
client:
simple:
instances:
order-service:
- uri: http://localhost:8081
- uri: http://localhost:8082
- uri: http://localhost:8083
Spring Cloud LoadBalancer ব্যবহার করতে WebClient-এ সরাসরি ইন্টিগ্রেশন করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
Spring Cloud LoadBalancer-কে @LoadBalanced
দিয়ে নির্দেশ করতে হয় যে এটি লোড ব্যালেন্সিং করতে হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class OrderServiceClient {
private final WebClient.Builder webClientBuilder;
@Autowired
public OrderServiceClient(WebClient.Builder webClientBuilder) {
this.webClientBuilder = webClientBuilder;
}
public String fetchOrderDetails() {
return webClientBuilder.build()
.get()
.uri("http://order-service/orders") // সার্ভিস নাম ব্যবহার করুন
.retrieve()
.bodyToMono(String.class)
.block();
}
}
Ribbon ব্যবহার করতে, নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
application.yml
কনফিগার করাRibbon সার্ভিস ইন্সট্যান্সের তালিকা থেকে সার্ভিস লোড ব্যালেন্স করবে:
order-service:
ribbon:
listOfServers: localhost:8081,localhost:8082,localhost:8083
Ribbon-এ লোড ব্যালেন্সিং করতে @LoadBalanced
অ্যানোটেশন ব্যবহার করুন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderServiceClient {
private final RestTemplate restTemplate;
@Autowired
public OrderServiceClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String fetchOrderDetails() {
return restTemplate.getForObject("http://order-service/orders", String.class);
}
}
Spring Cloud LoadBalancer-এ আপনি কাস্টম লোড ব্যালেন্সিং স্ট্র্যাটেজি ব্যবহার করতে পারেন।
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LoadBalancerConfig {
@Bean
public ReactorServiceInstanceLoadBalancer customLoadBalancer(ServiceInstanceListSupplier supplier) {
return new RandomLoadBalancer(supplier, "order-service"); // Random Load Balancing
}
}
Spring Cloud LoadBalancer ইন্টিগ্রেশন Eureka
বা অন্য Discovery সার্ভিসের সাথেও করা যায়।
pom.xml
-এ ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
উপরোক্ত কৌশলগুলো ব্যবহার করে আপনি একটি রিলায়েবল ক্লায়েন্ট-সাইড লোড ব্যালান্সিং মেকানিজম ইমপ্লিমেন্ট করতে পারবেন।
Read more